// src/api/index.ts

import axios, { AxiosRequestConfig, AxiosResponse } from "axios";
import { message } from "antd";
import store from "@store";
import { removeToken, getToken } from "@utils/auth";
import { logout as logoutAction } from "@store/modules/userSlice";
import router from "@router";

/**
 * 创建 Axios 实例
 */
const service = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL, // 从环境变量读取 API 地址
  timeout: 10000, // 请求超时时间：10s
});

/**
 * 请求拦截器
 */
service.interceptors.request.use(
  (config: AxiosRequestConfig) => {
    // 在发送请求之前可以添加 Authorization header
    const token = getToken();
    if (token) {
      // 假设后端要求 Authorization: Bearer <token>
      (config.headers as any)["Authorization"] = `Bearer ${token}`;
    }
    return config;
  },
  (error) => {
    console.error("[Request Error]", error);
    return Promise.reject(error);
  }
);

/**
 * 响应拦截器
 */
service.interceptors.response.use(
  (response: AxiosResponse) => {
    // 假设后端返回数据格式：{ code: number, data: T, message: string }
    const res = response.data;
    if (res.code !== 200) {
      // 当 code 不为 200 时，统一弹出错误提示
      message.error(res.message || "Error");

      // 401 / 403 情况：token 过期或无权限，清空 token 并跳转登录
      if (res.code === 401 || res.code === 403) {
        store.dispatch(logoutAction());
        router.navigate("/login", { replace: true }); // 注意：此处用 React Router v6 方式
      }
      return Promise.reject(new Error(res.message || "Error"));
    } else {
      // code === 200，直接返回 data
      return res.data;
    }
  },
  (error) => {
    console.error("[Response Error]", error);
    const status = error.response?.status;

    // 网络或服务器报错
    if (status === 401 || status === 403) {
      // token 失效或无权限
      message.error("身份已过期或无权限，请重新登录");
      store.dispatch(logoutAction());
      router.navigate("/login", { replace: true });
    } else {
      // 其他错误
      message.error(error.message || "Network Error");
    }
    return Promise.reject(error);
  }
);

export default service;
